// 头文件 -> 显示时间和文件
const headShow = require('./head')
console.log(headShow.headShow(__filename))
//-----------------

/** 位运算 
    核心思路是 每一位存储从低位起相应的数据内容 , 
    like  10000 -> 4   100 -> 2   1000 -> 3
    让 pos[x] 记录 所有 数的 转换
    让 bit[x] 通过异或 把 所有数据的 pos 垒起来
    只要没有重复的数 , 那么 bit[x] & pos[x] 就是 0
    但凡出现了重复 , 那么 bit[x] & pos[x] 就一定不是 0
    ok

    要求原数组 从 1 到 n , 不能有0 , 也不是不行 , 那就需要整体往上推一位 , 很烦
 * @param {number[]} nums
 * @return {number}
 */
var findDuplicate = function (nums) {
  let pos = Array(Math.ceil(nums.length / 32)).fill(0)
  let bit = Array(Math.ceil(nums.length / 32)).fill(0)

  for (let i = 0; i < nums.length; i++) {
    // let pos = 1 << nums[i]
    // if (pos & bit) return nums[i]
    // bit |= pos
    // console.log("num", nums[i], "pos", pos.toString(2), "bit", bit.toString(2))

    // 按照 位数 去 整 指定的 pos 和 bit
    let offset_mul = Math.floor(nums[i] / 32)
    let offset_mod = nums[i] % 32

    pos[offset_mul] = 1 << offset_mod
    if (pos[offset_mul] & bit[offset_mul]) return nums[i]
    bit[offset_mul] |= pos[offset_mul]

    console.log('num', nums[i], 'mul', offset_mul, 'mod', offset_mod, 'pos', pos[0].toString(2))
  }
}

numm = [
  13, 46, 8, 11, 20, 17, 40, 13, 13, 13, 14, 1, 13, 36, 48, 41, 13, 13, 13, 13, 45, 13, 28, 42, 13, 10, 15, 22, 13, 13, 13, 13, 23, 9, 6,
  13, 47, 49, 16, 13, 13, 39, 35, 13, 32, 29, 13, 25, 30, 13
]

console.log(findDuplicate(numm))
